﻿/**
 * Classe gérant les exceptions torrents
 */
var TorrentExceptions = {};

/**
 * Permet de tester si une URL fait partie des exceptions
 *
 * @param {String} url l'URL à tester
 *
 * @return {bool} True si l'URL fait partie d'une exclusion, false sinon.
 */
TorrentExceptions.test = function(url)
{
	// Récupération de toute les exceptions
	var exceptions = TorrentExceptions.getAll();
	
	for (var i = 0; i < exceptions.length; i++)
	{
		// Création de la regexp
		var exp = TorrentExceptions.toRegExp(exceptions[i]);
		var reg = new RegExp(exp,"i");
		
		// Test de l'URL
		if (reg.test(url))
			return true;
	}
	
	return false;
};

/**
 * Récupère toute les exceptions des torrents
 *
 * @return {Array} Liste des exceptions
 */
TorrentExceptions.getAll = function()
{
	// Récupération de la valeur stocké
	var jsonstr = Storage.get("torrent-exceptions");
	
	// S'il n'y en a pas, tableau vide
	if (!jsonstr)
		return [];
	else
	{
		// Sinon parsage JSON
		var exceptions = JSON.parse(jsonstr);
		return exceptions;
	}
};

/**
 * Ajoute une exception à la liste existante
 *
 * @param {String} exp L'exclusion à ajouter
 */
TorrentExceptions.add = function(exp)
{
	var jsonstr = Storage.get("torrent-exceptions");
	
	// S'il n'y en a pas, on en crée une avec la valeur
	if (!jsonstr)
	{
		var exceptions = [exp];
	}
	// Sinon, on ajoute la valeur à celle existante
	else
	{
		// On parse le JSON
		var exceptions = JSON.parse(jsonstr);
		var founded = false;
		// On cherche si la valeur existe
		for (var i = 0; i < exceptions.length; i++)
		{
			if (exceptions[i] == exp)
			{
				founded = true;
				break;
			}
		}
		// Si elle n'existe pas, on l'ajoute
		if (!founded)
			exceptions.push(exp);
	}
	
	// On sauvegarde les exceptions
	Storage.set("torrent-exceptions",exceptions.toJSONString());
};

/**
 * Purge la liste des exceptions torrents
 */
TorrentExceptions.clean = function()
{
	Storage.set("torrent-exceptions",[].toJSONString());
};

/**
 * Supprime une exception de la liste
 *
 * @param {String} exp L'exception à supprimer
 */
TorrentExceptions.remove = function(exp)
{
	var jsonstr = Storage.get("torrent-exceptions");
	
	// S'il n'y a pas de liste, on supprime rien
	if (!jsonstr)
		return;
	// Sinon, on va chercher si la valeur existe
	else
	{
		var exceptions = JSON.parse(jsonstr);
		var index = -1;
		// Recherche de l'index de la valeur
		for (var i = 0; i < exceptions.length; i++)
		{
			if (exceptions[i] == exp)
			{
				index = i;
				break;
			}
		}
		// Suppression du tableau si existante
		if (index != -1)
			exceptions.splice(i,1);
	}
	// Sauvegarde de la liste
	Storage.set("torrent-exceptions",exceptions.toJSONString());	
};

/**
 * Transforme une exception en RegExp
 *
 * Banalise la plupart des caractères spéciaux, et transforme "*" en ".*"
 *
 * @param {String} exp L'exception à banaliser
 *
 * @return {String} l'exception banalisée
 */
TorrentExceptions.toRegExp = function(str)
{
	var reg = str;
	reg = reg.replace("\\","\\\\");
	reg = reg.replace("/","\\/");
	reg = reg.replace("+","\\+");
	reg = reg.replace("?","\\?");
	reg = reg.replace("^","\\^");
	reg = reg.replace("$","\\$");
	reg = reg.replace("(","\\(");
	reg = reg.replace(")","\\)");
	reg = reg.replace("[","\\[");
	reg = reg.replace("]","\\]");
	reg = reg.replace("*",".*");
	
	return reg;
};

/**
 * Ajoute une liste d'exceptions
 *
 * @param {Array} l la liste des exceptions à ajouter
 */
TorrentExceptions.addList = function(l)
{
	for (var i = 0; i < l.length; i++)
	{
		TorrentExceptions.add(l[i]);
	}
};

if (typeof(TorrentExceptionsListe) != "undefined")
{
	var isInit = Storage.get("torrent-exceptions-base-init");
	if (!isInit || isInit == "0")
	{
		TorrentExceptions.addList(TorrentExceptionsListe);
		Storage.set("torrent-exceptions-base-init","1");
	}
}